group { name: "e/modules/clock/digital";
   min: 64 16;
   max: 512 128;
   images.image: "digit_0.png" COMP;
   images.image: "digit_1.png" COMP;
   images.image: "digit_2.png" COMP;
   images.image: "digit_3.png" COMP;
   images.image: "digit_4.png" COMP;
   images.image: "digit_5.png" COMP;
   images.image: "digit_6.png" COMP;
   images.image: "digit_7.png" COMP;
   images.image: "digit_8.png" COMP;
   images.image: "digit_9.png" COMP;
   images.image: "digit_am.png" COMP;
   images.image: "digit_pm.png" COMP;
   images.image: "digit_sep.png" COMP;
   script {
      public do_seconds, do_24h, do_date, tick_timer;

      evalsize() {
         new do24h, dosec, v[14], i, tot, mul;
         new parts[] = {
            PART:"hours1", PART:"hours1",
            PART:"hours2", PART:"hours2",
            PART:"mins1", PART:"mins1",
            PART:"mins2", PART:"mins2",
            PART:"secs1", PART:"secs1",
            PART:"secs2", PART:"secs2",
            PART:"ampm", PART:"ampm"
         };

         mul = 4;
         if (get_int(do_date)) {
            mul = 3;
         }

         for (i = 0; i < 14; i += 2) {
            custom_state(parts[i], "default", 0.0);
         }
         v[0] = 0; v[1] = 2; v[2] = 2; v[3] = 4; // hrs
         v[4] = 5; v[5] = 7; v[6] = 7; v[7] = 9; // mins
         tot = 9;

         dosec = get_int(do_seconds);
         do24h = get_int(do_24h);
         if ((dosec) && (!do24h)) { // sec + ampm
            tot += 7;
            v[8] = 10; v[9] = 12; v[10] = 12; v[11] = 14;
            v[12] = 14; v[13] = 16;
         }
         else if ((dosec) && (do24h)) { // sec + -
            tot += 5;
            v[8] = 10; v[9] = 12; v[10] = 12; v[11] = 14;
            v[12] = 0; v[13] = 0;
         }
         else if ((!dosec) && (!do24h)) { // - + ampm
            tot += 2;
            v[8] = 0; v[9] = 0; v[10] = 0; v[11] = 0;
            v[12] = 9; v[13] = 11;
         }
         else if ((!dosec) && (do24h)) { // - + -
            tot += 0;
            v[8] = 0; v[9] = 0; v[10] = 0; v[11] = 0;
            v[12] = 0; v[13] = 0;
         }
         for (i = 0; i < 14; i += 2) {
            set_state_val(parts[i], STATE_REL1,
                          float(v[i]) / float(tot), 0.0);
            set_state_val(parts[i + 1], STATE_REL2,
                          float(v[i + 1]) / float(tot), 1.0);
         }
         for (i = 0; i < 14; i += 2) {
            set_state(parts[i], "custom", 0.0);
         }
         set_min_size(tot * mul, 16);
         set_max_size(tot * 8 * mul, 128);
         emit("e,state,sizing,changed", "");
      }
      reset() {
         new tim;

         evalsize();
         tim = get_int(tick_timer);
         if (tim) {
            cancel_timer(tim);
            set_int(tick_timer, 0);
         }
         clock_cb(0);
      }
      valset(name[], v) {
         new buf[20], i;

         for (i = 0; i < 10; i++) {
            if (i == v) {
               snprintf(buf, 20, "show,%s-%i", name, i);
            }
            else {
               snprintf(buf, 20, "hide,%s-%i", name, i);
            }
            emit(buf, "c");
         }
      }
      apvalset(id, pm) {
         if (pm) set_state(id, "active", 0.0);
         else set_state(id, "default", 0.0);
      }
      public clock_cb(val) {
         new year, month, day, yearday, weekday, hour, minute;
         new Float:second;
         new v, dosec, do24h, tim;

         date(year, month, day, yearday, weekday, hour, minute, second);
         dosec = get_int(do_seconds);
         if (dosec) {
            v = round(second, FLOOR);
            v = v % 60;
            tim = timer(1.0 - (second - v), "clock_cb", 1);
            // set seconds to v
            valset("s0", v / 10);
            valset("s1", v % 10);
         }
         else {
            tim = timer(60.0 - (second), "clock_cb", 1);
         }
         set_int(tick_timer, tim);

         // set minutes to minute
         valset("m0", minute / 10);
         valset("m1", minute % 10);

         // set hours to hour
         do24h = get_int(do_24h);
         if (do24h) {
            valset("h0", hour / 10);
            valset("h1", hour % 10);
         }
         else {
            new pm;

            // if 12 or later, its pm
            if (hour >= 12) {
               pm = 1;
               // if we are after 12 (1, 2, 3 etc.) then mod by 12
               if (hour > 12) hour = hour % 12;
            }
            else {
               pm = 0;
               // make after midnight be 12:XX AM :)
               if (hour == 0) hour = 12;
            }
            valset("h0", hour / 10);
            valset("h1", hour % 10);
            apvalset(PART:"ap", pm);
         }
      }
   }
   parts {
      part { name: "secclip"; type: RECT;
         description { state: "default" 0.0;
         }
         description { state: "hidden" 0.0;
            visible: 0;
         }
      }
      part { name: "ampmclip"; type: RECT;
         description { state: "default" 0.0;
         }
         description { state: "hidden" 0.0;
            visible: 0;
         }
      }
      // XXX: hours1/2, mins1/2, secs1/2 and ampm SHOULD be spacers... but
      // if they are calculations go weird. this shouldnt happen, but does.
      part { name: "timearea"; type: RECT;
         description { state: "default" 0.0;
            visible: 0;
         }
         description { state: "date" 0.0;
            inherit: "default" 0.0;
            rel2.relative: 1.0 0.0;
            rel2.offset: -1 4;
            rel2.to_y: "e.text.today";
         }
      }
      part { name: "hours1"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (0/30) 0.0;
            rel2.relative: (4/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "hours2"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (4/30) 0.0;
            rel2.relative: (8/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "mins1"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (9/30) 0.0;
            rel2.relative: (13/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "mins2"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (13/30) 0.0;
            rel2.relative: (17/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "secs1"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (18/30) 0.0;
            rel2.relative: (22/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "secs2"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (22/30) 0.0;
            rel2.relative: (26/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "ampm"; type: RECT;
         description { state: "default" 0.0;
            rel1.relative: (26/30) 0.0;
            rel2.relative: (30/30) 1.0;
            rel1.to: "timearea";
            rel2.to: "timearea";
            visible: 0;
         }
      }
      part { name: "c00";
         description { state: "default" 0.0;
            rel1.to: "hours2";
            rel1.relative: 1.0 0.39;
            rel2.to: "mins1";
            rel2.relative: 0.0 0.45;
            image.normal: "digit_sep.png";
            color_class: "/fg/normal/gadgets/clock/digital/separator";
            aspect: 1.0 1.0; aspect_preference: BOTH;
         }
      }
      part { name: "c01";
         description { state: "default" 0.0;
            rel1.to: "hours2";
            rel1.relative: 1.0 0.55;
            rel2.to: "mins1";
            rel2.relative: 0.0 0.61;
            image.normal: "digit_sep.png";
            color_class: "/fg/normal/gadgets/clock/digital/separator";
            aspect: 1.0 1.0; aspect_preference: BOTH;
         }
      }
      part { name: "c10";
         clip_to: "secclip";
         description { state: "default" 0.0;
            rel1.to: "mins2";
            rel1.relative: 1.0 0.39;
            rel2.to: "secs1";
            rel2.relative: 0.0 0.45;
            image.normal: "digit_sep.png";
            color_class: "/fg/normal/gadgets/clock/digital/separator";
            aspect: 1.0 1.0; aspect_preference: BOTH;
         }
      }
      part { name: "c11";
         clip_to: "secclip";
         description { state: "default" 0.0;
            rel1.to: "mins2";
            rel1.relative: 1.0 0.55;
            rel2.to: "secs1";
            rel2.relative: 0.0 0.61;
            image.normal: "digit_sep.png";
            color_class: "/fg/normal/gadgets/clock/digital/separator";
            aspect: 1.0 1.0; aspect_preference: BOTH;
         }
      }
#define ELEM(_NAME, _TO, _DIGIT, _CC) \
   part { name: _NAME; \
      description { state: "default" 0.0; \
         rel1.to: _TO; rel2.to: _TO; \
         aspect: (52/72) (52/72); aspect_preference: BOTH; \
         image.normal: "digit_"_DIGIT".png"; \
         visible: 0; \
         color: 255 255 255 0; /* no cc */ \
         color_class: _CC; \
      } \
      description { state: "active" 0.0; \
         inherit: "default" 0.0; \
         visible: 1; \
         color: 255 255 255 255; /* no cc */ \
      } \
   }
#define DIGIT(_NAME, _TO, _CC) \
   ELEM(_NAME"-0", _TO, "0", _CC) \
   ELEM(_NAME"-1", _TO, "1", _CC) \
   ELEM(_NAME"-2", _TO, "2", _CC) \
   ELEM(_NAME"-3", _TO, "3", _CC) \
   ELEM(_NAME"-4", _TO, "4", _CC) \
   ELEM(_NAME"-5", _TO, "5", _CC) \
   ELEM(_NAME"-6", _TO, "6", _CC) \
   ELEM(_NAME"-7", _TO, "7", _CC) \
   ELEM(_NAME"-8", _TO, "8", _CC) \
   ELEM(_NAME"-9", _TO, "9", _CC)
#define ELEMC(_NAME, _TO, _DIGIT, _CLIP, _CC) \
   part { name: _NAME; \
      clip_to: _CLIP; \
      description { state: "default" 0.0; \
         rel1.to: _TO; rel2.to: _TO; \
         aspect: (52/72) (52/72); aspect_preference: BOTH; \
         image.normal: "digit_"_DIGIT".png"; \
         visible: 0; \
         color: 255 255 255 0; /* no cc */ \
         color_class: _CC; \
      } \
      description { state: "active" 0.0; \
         inherit: "default" 0.0; \
         visible: 1; \
         color: 255 255 255 255; /* no cc */ \
      } \
   }
#define DIGITC(_NAME, _TO, _CLIP, _CC) \
   ELEMC(_NAME"-0", _TO, "0", _CLIP, _CC) \
   ELEMC(_NAME"-1", _TO, "1", _CLIP, _CC) \
   ELEMC(_NAME"-2", _TO, "2", _CLIP, _CC) \
   ELEMC(_NAME"-3", _TO, "3", _CLIP, _CC) \
   ELEMC(_NAME"-4", _TO, "4", _CLIP, _CC) \
   ELEMC(_NAME"-5", _TO, "5", _CLIP, _CC) \
   ELEMC(_NAME"-6", _TO, "6", _CLIP, _CC) \
   ELEMC(_NAME"-7", _TO, "7", _CLIP, _CC) \
   ELEMC(_NAME"-8", _TO, "8", _CLIP, _CC) \
   ELEMC(_NAME"-9", _TO, "9", _CLIP, _CC)
#define TAG(_NAME, _TO, _CLIP, _CC) \
   part { name: _NAME; \
      clip_to: _CLIP; \
      description { state: "default" 0.0; \
         rel1.to: _TO; rel2.to: _TO; \
         aspect: (48/31) (48/31); aspect_preference: BOTH; \
         image.normal: "digit_am.png"; \
         color_class: _CC; \
      } \
      description { state: "active" 0.0; \
         inherit: "default" 0.0; \
         image.normal: "digit_pm.png"; \
      } \
   }
// color_class: "/fg/normal/gadgets/clock/time/digital/hours";
// color_class: "/fg/normal/gadgets/clock/time/digital/mins";
// color_class: "/fg/normal/gadgets/clock/time/digital/secs";
// color_class: "/fg/normal/gadgets/clock/time/digital/ampm";
      DIGIT ("h0", "hours1", "/fg/normal/gadgets/clock/time/digital/hours")
      DIGIT ("h1", "hours2", "/fg/normal/gadgets/clock/time/digital/hours")
      DIGIT ("m0", "mins1", "/fg/normal/gadgets/clock/time/digital/mins")
      DIGIT ("m1", "mins2", "/fg/normal/gadgets/clock/time/digital/mins")
      DIGITC("s0", "secs1", "secclip", "/fg/normal/gadgets/clock/time/digital/secs")
      DIGITC("s1", "secs2", "secclip", "/fg/normal/gadgets/clock/time/digital/secs")
      TAG("ap", "ampm", "ampmclip", "/fg/normal/gadgets/clock/time/digital/ampm")
#undef TAG
#undef TAG
#undef ELEM
#undef ELEMC
#undef DIGIT
#undef DIGITC

       part { name: "e.text.today"; type: TEXT;
          scale: 1;
          description { state: "default" 0.0;
             rel1.relative: 0.0 1.0;
             rel1.offset: 0 1;
             rel2.offset: -1 -1;
             align: 0.5 1.0;
             color_class: "/fg/normal/gadgets/clock/time/text/date";
             text { font: FN; size: 8;
                text_class: "module_small";
                align: 0.5 0.5;
                min: 0 1;
             }
             fixed: 0 1;
             visible: 0;
          }
          description { state: "date" 0.0;
             inherit: "default" 0.0;
             visible: 1;
             fixed: 1 1;
             text.min: 0 1;
             text.ellipsis: 0;
          }
       }
       part { name: "event"; type: RECT;
          description { state: "default" 0.0;
             color: 0 0 0 0; // no cc
          }
       }
   }
   programs {
      program { signal: "load"; source: "";
         script {
            reset();
         }
      }
      program { signal: "e,state,date,on"; source: "e";
         script {
            set_int(do_date, 1);
            set_state(PART:"timearea", "date", 0.0);
            set_state(PART:"e.text.today", "date", 0.0);
            reset();
         }
      }
      program { signal: "e,state,date,off"; source: "e";
         script {
            set_int(do_date, 0);
            set_state(PART:"timearea", "default", 0.0);
            set_state(PART:"e.text.today", "default", 0.0);
            reset();
         }
      }
      program { signal: "e,state,seconds,on"; source: "e";
         script {
            set_int(do_seconds, 1);
            set_state(PART:"secclip", "default", 0.0);
            reset();
         }
      }
      program { signal: "e,state,seconds,off"; source: "e";
         script {
            set_int(do_seconds, 0);
            set_state(PART:"secclip", "hidden", 0.0);
            reset();
         }
      }
      program { signal: "e,state,24h,on"; source: "e";
         script {
            set_int(do_24h, 1);
            set_state(PART:"ampmclip", "hidden", 0.0);
            reset();
         }
      }
      program { signal: "e,state,24h,off"; source: "e";
         script {
            set_int(do_24h, 0);
            set_state(PART:"ampmclip", "default", 0.0);
            reset();
         }
      }
#define DIGPRG(_NAME) \
      program { signal: "show,"_NAME; source: "c"; \
         action: STATE_SET "active" 0.0; \
         target: _NAME; \
      } \
      program { signal: "hide,"_NAME; source: "c"; \
         action: STATE_SET "default" 0.0; \
         transition: DECELERATE 0.1; \
         target: _NAME; \
      }
#define DIGPRGS(_NAME) \
      DIGPRG(_NAME"-0") \
      DIGPRG(_NAME"-1") \
      DIGPRG(_NAME"-2") \
      DIGPRG(_NAME"-3") \
      DIGPRG(_NAME"-4") \
      DIGPRG(_NAME"-5") \
      DIGPRG(_NAME"-6") \
      DIGPRG(_NAME"-7") \
      DIGPRG(_NAME"-8") \
      DIGPRG(_NAME"-9")

      DIGPRGS("h0")
      DIGPRGS("h1")
      DIGPRGS("m0")
      DIGPRGS("m1")
      DIGPRGS("s0")
      DIGPRGS("s1")
#undef DIGPRG
#undef DIGPRGS
      program { signal: "e,state,freeze"; source: "e";
         script {
            new tim;

            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
         }
      }
      program { signal: "e,state,thaw"; source: "e";
         script {
            new tim;

            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
            clock_cb(0);
         }
      }
   }
}

group { name: "e/modules/clock/main";
   set { name: "clock_base";
      image { image: "clock_base-160.png" COMP; size: 81 81 99999 99999; }
      image { image: "clock_base-080.png" COMP; size: 41 41 80 80; }
      image { image: "clock_base-040.png" COMP; size: 0 0 40 40; }
   }
   set { name: "clock_base_digits";
      image { image: "clock_base_digits-160.png" COMP; size: 81 81 99999 99999; }
      image { image: "clock_base_digits-080.png" COMP; size: 41 41 80 80; }
      image { image: "clock_base_digits-040.png" COMP; size: 0 0 40 40; }
   }
   set { name: "clock_hand_secs";
      image { image: "clock_hand_secs-160.png" COMP; size: 81 81 99999 99999; }
      image { image: "clock_hand_secs-080.png" COMP; size: 41 41 80 80; }
      image { image: "clock_hand_secs-040.png" COMP; size: 0 0 40 40; }
   }
   set { name: "clock_hand_mins";
      image { image: "clock_hand_mins-160.png" COMP; size: 81 81 99999 99999; }
      image { image: "clock_hand_mins-080.png" COMP; size: 41 41 80 80; }
      image { image: "clock_hand_mins-040.png" COMP; size: 0 0 40 40; }
   }
   set { name: "clock_hand_hours";
      image { image: "clock_hand_hours-160.png" COMP; size: 81 81 99999 99999; }
      image { image: "clock_hand_hours-080.png" COMP; size: 41 41 80 80; }
      image { image: "clock_hand_hours-040.png" COMP; size: 0 0 40 40; }
   }
   min: 16 16;
   max: 160 160;
   script {
      public do_seconds, tick_timer;

         public clock_cb(val) {
            new year, month, day, yearday, weekday, hour, minute;
            new Float:second;
            new v, dosec, tim;

            date(year, month, day, yearday, weekday, hour, minute, second);
            dosec = get_int(do_seconds);
            if (dosec) {
               v = round(second, FLOOR);
               tim = timer(1.0 - (second - v), "clock_cb", 1);

               custom_state(PART:"seconds", "default", 0.0);
               set_state_val(PART:"seconds", STATE_MAP_ROT_Z, (v * 360.0) / 60.0);
               set_state(PART:"seconds", "custom", 0.0);
            }
            else {
               tim = timer(60.0 - (second), "clock_cb", 1);
            }
            set_int(tick_timer, tim);

            custom_state(PART:"minutes", "default", 0.0);
            set_state_val(PART:"minutes", STATE_MAP_ROT_Z, (float(minute) * 360.0) / 60.0);
            set_state(PART:"minutes", "custom", 0.0);

            custom_state(PART:"hours", "default", 0.0);
            set_state_val(PART:"hours", STATE_MAP_ROT_Z, ((float(hour) + (float(minute) / 60.0)) * 360.0) / 12.0);
            set_state(PART:"hours", "custom", 0.0);
         }
   }
   parts {
      part { name: "base"; mouse_events: 0;
         description { state: "default" 0.0;
            aspect: 1.0 1.0; aspect_preference: BOTH;
            image.normal: "clock_base";
            color_class: "/bg/normal/gadgets/clock/analog/base";
         }
      }
      part { name: "digits"; mouse_events: 0;
         description { state: "default" 0.0;
            rel.to: "base";
            image.normal: "clock_base_digits";
            color_class: "/fg/normal/gadgets/clock/analog/digits";
         }
      }
      part { name: "seconds"; mouse_events: 0;
         description { state: "default" 0.0;
            image.normal: "clock_hand_secs";
            color_class: "/fg/normal/gadgets/clock/analog/hands/secs";
            rel.to: "base";
            map { on: 1;
               rotation.center: "base";
            }
         }
         description { state: "hidden" 0.0;
            inherit: "default" 0.0;
            visible: 0;
         }
      }
      part { name: "minutes"; mouse_events: 0;
         description { state: "default" 0.0;
            image.normal: "clock_hand_mins";
            color_class: "/fg/normal/gadgets/clock/analog/hands/mins";
            rel.to: "base";
            map { on: 1;
               rotation.center: "base";
            }
         }
      }
      part { name: "hours"; mouse_events: 0;
         description { state: "default" 0.0;
            image.normal: "clock_hand_hours";
            color_class: "/fg/normal/gadgets/clock/analog/hands/hours";
            rel.to: "base";
            map { on: 1;
               rotation.center: "base";
            }
         }
      }
      part { name: "event"; type: RECT;
         description { state: "default" 0.0;
            color: 0 0 0 0; // no cc
         }
      }
   }
   programs {
      program { signal: "load"; source: "";
         script {
            clock_cb(0);
         }
      }
      program { signal: "e,state,seconds,on"; source: "e";
         action: STATE_SET "default" 0.0;
         target: "seconds";
         after: "sec2";
      }
      program { name: "sec2";
         script {
            new tim;

            set_int(do_seconds, 1);
            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
            clock_cb(0);
         }
      }
      program { signal: "e,state,seconds,off"; source: "e";
         action: STATE_SET "hidden" 0.0;
         target: "seconds";
         after: "sec3";
      }
      program { name: "sec3";
         script {
            new tim;

            set_int(do_seconds, 0);
            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
            clock_cb(0);
         }
      }
      program { signal: "e,state,freeze"; source: "e";
         script {
            new tim;

            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
         }
      }
      program { signal: "e,state,thaw"; source: "e";
         script {
            new tim;

            tim = get_int(tick_timer);
            if (tim) {
               cancel_timer(tim);
               set_int(tick_timer, 0);
            }
            clock_cb(0);
         }
      }
   }
}

group { name: "e/modules/clock/calendar/dayname";
   parts {
      part { name: "e.text.label"; type: TEXT; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/name/week";
            text { font: FN; size: 8;
               text: "WWe";
               min: 1 1;
               ellipsis: -1;
               align: 0.5 0.5;
               text_class: "module_small";
            }
         }
         description { state: "weekend" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/name/weekend";
         }
      }
   }
   programs {
      program { signal: "e,state,weekend"; source: "e";
         action: STATE_SET "weekend" 0.0;
         target: "e.text.label";
      }
      program { signal: "e,state,weekday"; source: "e";
         action: STATE_SET "default" 0.0;
         target: "e.text.label";
      }
   }
}

group { name: "e/modules/clock/calendar/day";
   script {
      public day_state = 0;
      evalstate() {
         new vv = get_int(day_state);

         if (vv & 2) {
            set_state(PART:"e.text.label", "today", 0.0);
            set_state(PART:"label2", "today", 0.0);
            set_state(PART:"base", "today", 0.0);
         } else if (vv & 4) {
            set_state(PART:"e.text.label", "hidden", 0.0);
            set_state(PART:"label2", "default", 0.0);
            set_state(PART:"base", "default", 0.0);
         } else if (vv & 1) {
            set_state(PART:"e.text.label", "weekend", 0.0);
            set_state(PART:"label2", "default", 0.0); 
            set_state(PART:"base", "default", 0.0);
         } else {
            set_state(PART:"e.text.label", "default", 0.0);
            set_state(PART:"label2", "default", 0.0);
            set_state(PART:"base", "default", 0.0);
         }
      }
   }
   parts {
      part { name: "base"; type: RECT; mouse_events: 0;
         description { state: "default" 0.0;
            color_class: "/bg/normal/gadgets/clock/cal/day/date/normal";
            visible: 0;
         }
         description { state: "today" 0.0;
            inherit: "default" 0.0;
            color_class: "/bg/normal/gadgets/clock/cal/day/date/today";
            visible: 1;
         }
         description { state: "weekend" 0.0;
            inherit: "default" 0.0;
            color_class: "/bg/normal/gadgets/clock/cal/day/date/weekend";
            visible: 1;
         }
         description { state: "hidden" 0.0;
            inherit: "default" 0.0;
            color_class: "/bg/normal/gadgets/clock/cal/day/date/hidden";
            visible: 1;
         }
      }
      part { name: "e.text.label"; type: TEXT; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/date/normal";
            rel1.offset: 3 3;
            rel2.offset: -4 -4;
            offscale;
            text { font: FN; size: 10;
               text: "00";
               min: 1 1;
               ellipsis: -1;
               align: 0.5 0.5;
            }
         }
         description { state: "today" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/date/today";
            visible: 0;
         }
         description { state: "weekend" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/date/weekend";
         }
         description { state: "hidden" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/date/faded";
         }
      }
      part { name: "label2"; type: TEXT; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/day/date/today";
            rel.to: "e.text.label";
            text { font: FN; size: 10;
               text_source: "e.text.label";
               min: 1 1;
               ellipsis: -1;
               align: 0.5 0.5;
            }
            visible: 0;
         }
         description { state: "today" 0.0;
            inherit: "default" 0.0;
            visible: 1;
         }
      }
   }
   programs {
      program { signal: "e,state,weekend"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv | 1);
            evalstate();
         }
      }
      program { signal: "e,state,weekday"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv & (~1));
            evalstate();
         }
      }

      program { signal: "e,state,today"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv | 2);
            evalstate();
         }
      }
      program { signal: "e,state,someday"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv & (~2));
            evalstate();
         }
      }

      program { signal: "e,state,hidden"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv | 4);
            evalstate();
         }
      }
      program { signal: "e,state,visible"; source: "e";
         script {
            new vv = get_int(day_state);
            set_int(day_state, vv & (~4));
            evalstate();
         }
      }
   }
}

group { name: "e/modules/clock/calendar";
   parts {
      part { name: "e.text.month"; type: TEXT;
         mouse_events: 1;
         scale: 1;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.0 0.0;
            rel1.to_x: "prev";
            rel1.relative: 1.0 0.0;
            rel1.offset: 4 0;
            rel2.relative: 1.0 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/month";
            text { font: FNBD; size: 10;
               text: "000000000000";
               align: 0.0 0.5;
               min: 0 1;
               text_class: "module_normal";
            }
         }
      }
      part { name: "e.text.year"; type: TEXT; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 1.0 0.0;
            rel1.relative: 0.0 0.0;
            rel2.to_x: "next";
            rel2.offset: -5 -1;
            rel2.relative: 0.0 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/year";
            text { font: FNBD; size: 10;
               text: "0000";
               align: 1.0 0.5;
               min: 0 1;
               text_class: "module_normal";
            }
         }
      }
      part { name: "previm"; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            fixed: 1 1;
            min: 15 15;
            max: 15 15;
            rel.to: "prev";
            image.normal: "i-arrow-l";
            color_class: "/fg/normal/gadgets/clock/cal/prev";
         }
         description { state: "pressed" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/pressed/gadgets/clock/cal/prev";
         }
      }
      part { name: "prev"; type: RECT;
         description { state: "default" 0.0;
            align: 0.0 0.5;
            color: 0 0 0 0; // no cc
            aspect: 1.0 1.0; aspect_preference: VERTICAL;
            rel1.to_y: "e.text.month";
            rel1.relative: 0.0 0.0;
            rel2.to_y: "e.text.month";
            rel2.relative: 0.0 1.0;
         }
         program { signal: "mouse,down,1*"; source: "prev";
            action: STATE_SET "pressed" 0.0;
            target: "previm";
         }
         program { signal: "mouse,up,1"; source: "prev";
            action: STATE_SET "default" 0.0;
            target: "previm";
         }
         program { signal: "mouse,clicked,1*"; source: "prev";
            action: SIGNAL_EMIT "e,action,prev" "";
         }
      }
      part { name: "nextim"; mouse_events: 0;
         scale: 1;
         description { state: "default" 0.0;
            fixed: 1 1;
            min: 15 15;
            max: 15 15;
            rel.to: "next";
            image.normal: "i-arrow-r";
            color_class: "/fg/normal/gadgets/clock/cal/next";
         }
         description { state: "pressed" 0.0;
            inherit: "default" 0.0;
            color_class: "/fg/pressed/gadgets/clock/cal/next";
         }
      }
      part { name: "next"; type: RECT;
         description { state: "default" 0.0;
            align: 1.0 0.5;
            color: 0 0 0 0; // no cc
            aspect: 1.0 1.0; aspect_preference: VERTICAL;
            rel1.to_y: "e.text.month";
            rel1.relative: 1.0 0.0;
            rel2.to_y: "e.text.month";
            rel2.relative: 1.0 1.0;
         }
         program { signal: "mouse,down,1"; source: "next";
            action: STATE_SET "pressed" 0.0;
            target: "nextim";
         }
         program { signal: "mouse,up,1"; source: "next";
            action: STATE_SET "default" 0.0;
            target: "nextim";
         }
         program { signal: "mouse,clicked,1"; source: "next";
            action: SIGNAL_EMIT "e,action,next" "";
         }
      }
      part { name: "sep"; type: RECT;
         description { state: "default" 0.0;
            color_class: "/fg/normal/gadgets/clock/cal/daydate-sep";
            rel1.relative: 0.0 1.0;
            rel1.offset: 8 0;
            rel1.to: "e.table.daynames";
            rel2.relative: 1.0 0.0;
            rel2.offset: -9 -1;
            rel2.to_y: "e.table.days";
            min: 0 1;
            max: 99999 1;
         }
      }

      part { name: "e.table.daynames"; type: TABLE;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.5 0.0;
            rel1.to_y: "e.text.month";
            rel1.relative: 0.0 1.0;
            rel1.offset: 8 2;
            rel2.to_y: "e.text.month";
            rel2.relative: 1.0 1.0;
            rel2.offset: -9 2;
            step: 7 1;
            table { homogeneous: TABLE;
               padding: 1 1;
               align: 0.5 0.5;
               min: 1 1;
            }
         }
         table {
            items {
#define D(x) \
item { \
   position: x 0; \
   span: 1 1; \
   source: "e/modules/clock/calendar/dayname"; \
   weight: 1.0 1.0; \
   align: -1.0 -1.0; \
}
               D(0) D(1) D(2) D(3) D(4) D(5) D(6)
#undef D                 
            }
         }
      }
      part { name: "e.table.days"; type: TABLE;
         scale: 1;
         description { state: "default" 0.0;
            rel1.to_y: "e.table.daynames";
            rel1.relative: 0.0 1.0;
            rel1.offset: 8 16;
            rel2.offset: -9 -9;
            offscale;
            step: 7 5;
            table { homogeneous: TABLE;
               padding: 1 1;
               align: 0.5 0.5;
               min: 1 1;
            }
         }
         table {
            items {
#define D(x, y) \
item { \
   position: x y; \
   span: 1 1; \
   source: "e/modules/clock/calendar/day"; \
   weight: 1.0 1.0; \
   align: -1.0 -1.0; \
}
               D(0, 0) D(1, 0) D(2, 0) D(3, 0) D(4, 0) D(5, 0) D(6, 0)
               D(0, 1) D(1, 1) D(2, 1) D(3, 1) D(4, 1) D(5, 1) D(6, 1)
               D(0, 2) D(1, 2) D(2, 2) D(3, 2) D(4, 2) D(5, 2) D(6, 2)
               D(0, 3) D(1, 3) D(2, 3) D(3, 3) D(4, 3) D(5, 3) D(6, 3)
               D(0, 4) D(1, 4) D(2, 4) D(3, 4) D(4, 4) D(5, 4) D(6, 4)
               D(0, 5) D(1, 5) D(2, 5) D(3, 5) D(4, 5) D(5, 5) D(6, 5)
#undef D
            }
         }
      }
   }
}
